import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
import java.util.Map;

public class WordUtil {
    public Configuration configure=null;
    public WordUtil(){
//       configure=new Configuration(Configuration.VERSION_2_3_22);
        configure=new Configuration();
        configure.setDefaultEncoding("utf-8");
    }
    //创建word
    public void createDoc(Map<String,Object> dataMap, String downloadType, String savePath){

        try {
            URL resource = this.getClass().getClassLoader().getResource("aa1.doc");
            this.getClass().getResource("/demo2.txt");
            System.err.println(resource);
            //加载需要装填的模板
            Template template=null;
            //设置模板装置方法和路径，FreeMarker支持多种模板装载方法。可以从servlet，classpath,数据库装载。
            //加载模板文件，放在template下
            configure.setClassForTemplateLoading(this.getClass(), "/com/~/util/template");
            //设置对象包装器
            //configure.setObjectWrapper(new DefaultObjectWrapper());
            //设置异常处理器
            configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
            //定义Template对象，注意模板类型名字与downloadType要一致
            template=configure.getTemplate("a.xml");
            File outFile=new File(savePath);
            Writer out=null;
            //指定编码表需使用转换流，转换流对象要接收一个字节输出流
//            out = response.getWriter();
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(outFile);
                OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");
                //这个地方对流的编码不可或缺，使用main（）单独调用时，应该可以，但是如果是web请求导出时导出后word文档就会打不开，并且包XML文件错误。主要是编码格式不正确，无法解析。
                //out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
                out = new BufferedWriter(oWriter);
            } catch (FileNotFoundException e1) {
                e1.printStackTrace();
            }
            template.process(dataMap, out);

            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        }
    }
}